home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Think Class Libraries / TP TCL->CW TCL v1.1.2.3 / UPI ƒ / Porting to UPIs ƒ / Sane2FP.p < prev   
Text File  |  1996-04-20  |  2KB  |  109 lines

  1. unit Sane2FP; {v1.0, by Vik Rubenfeld, 1996. Freely distributable.}
  2.  
  3. interface
  4. Uses  FP, Types, TextUtils;
  5.  
  6. type
  7.     DecStr = string[255];
  8.     cString = packed array[1..256] of char;
  9.     
  10.     procedure Num2Str(DF: DecForm; R: double_t; var S: DecStr);
  11.  
  12.     FUNCTION Str2Num(s: Str255): Double_t;
  13.  
  14.     Function Num2Integer(R: double_t): integer;
  15.  
  16.     function ItsANaN (R: double_t): Boolean;
  17.  
  18.     function GetMeAnNaN: double_t;
  19.  
  20.     Function Num2LongInt(R: double_t): LongInt;
  21.  
  22.     function TruncForLongInts(R: double_t): LongInt;
  23.  
  24. implementation
  25.     procedure Num2Str(DF: DecForm; R: double_t; var S: DecStr);
  26.     var
  27.         DecimalRec: decimal;
  28.         CS: cString;
  29.         theStringPtr: StringPtr;
  30.     begin
  31.         num2dec(DF, R, DecimalRec);
  32.           dec2str(DF, DecimalRec, @CS);
  33.           theStringPtr:= c2pstr(@CS);
  34.         S:= Str255(CS);
  35.     end;
  36.     
  37.     FUNCTION Str2Num(s: Str255): Double_t;
  38.     VAR
  39.         DecimalRec:    Decimal;
  40.         CSPtr:         ConstCStringPtr;
  41.         anIndex:       INTEGER;
  42.         aValidPrefix:  INTEGER; { ignore }
  43.     
  44.     BEGIN
  45.         CSPtr := P2CStr(@S);
  46.         anIndex:= 0;
  47.         str2dec( CSPtr, anIndex, DecimalRec, aValidPrefix );
  48.         Str2Num := dec2num( DecimalRec );
  49.     END;
  50.     
  51.     Function Num2Integer(R: double_t): integer;
  52.     var
  53.         DecimalRec: decimal;
  54.         DF: DecForm;
  55.     begin
  56.         DF.Style:= FixedDecimal;
  57.         DF.Digits:= 99;
  58.           num2dec(DF, R, DecimalRec);
  59.           Num2Integer:= dec2s(DecimalRec);
  60.     end;
  61.     
  62.     Function Num2LongInt(R: double_t): LongInt;
  63.     var
  64.         DecimalRec: decimal;
  65.         DF: DecForm;
  66.     begin
  67.         DF.Style:= FixedDecimal;
  68.         DF.Digits:= 99;
  69.           num2dec(DF, R, DecimalRec);
  70.           Num2LongInt:= dec2l(DecimalRec);
  71.     end;
  72.  
  73.     function ItsANaN (R: double_t): Boolean;
  74.     var
  75.         DecimalRec: decimal;
  76.         DF: DecForm;
  77.         theClass: integer;
  78.      begin
  79.          {DF.Style:= FixedDecimal;
  80.         DF.Digits:= 99;
  81.          num2dec(DF, R, DecimalRec);
  82.         ItsANaN:= DecimalRec.Sig[0] = 'N';}
  83.         
  84.         theClass:= __fpclassifyd(R);
  85.         ItsANaN:= not (theClass in [FP_ZERO, FP_NORMAL]);
  86.     end;
  87.  
  88.     function GetMeAnNaN: double_t;
  89.     var
  90.         S: DecStr;
  91.         theConstCStringPtr: ConstCStringPtr;
  92.     begin
  93.         S:= '32';
  94.         theConstCStringPtr:= ConstCStringPtr(P2CStr(@S));
  95.         GetMeAnNaN := NaN(theConstCStringPtr);    
  96.     end;
  97.     
  98.     {on 68k machines Trunc returns an integer. This routine is helpful if you need to
  99.     return a LongInt}
  100.     function TruncForLongInts(R: double_t): LongInt;
  101.     begin
  102.         R:= Floor(R);
  103.         TruncForLongInts:= Num2LongInt(R);
  104.     end;
  105.     
  106.  
  107. end.
  108.  
  109.